#ifndef FIRMWARE_UPDATE_EXTR_H
#define FIRMWARE_UPDATE_EXTR_H

#include "config.h"



#define FALSE	0
#define TRUE	1

#define TOTAL_HEADER_LEN	26			//两个"$$"+ UPDATA_HEADER的长度

#define	FIRMWARE_SAVE						 0x08008400
#define SAVE_SDDRESS_BEGIN			0x0800F800

//每个数据的固定长度
#define SINGLE_DATA_LENGTH				2



#define MAX_FIRMWARE_LEN                0x6400

//应用程序保存位置
#define WORK_FIRMWARE_ADDR		        	0x08002000

//升级程序保存位置
#define	UPDATE_FIRMWARE_ADDR					  (WORK_FIRMWARE_ADDR + MAX_FIRMWARE_LEN)  //0x08008400

//配置信息起始地址
#define UPDATE_CFG_ADDR	    		        0x0800F800

 

typedef struct tagUpdateConfig
{
	 u8     ValidMark[16];// 存储的变量是否有效标志
	u16    CurVersion;//	 正在运行的固件版本
	u16    UpdateVersion;//	 升级程序空间中的目标固件版本
	u16    NewFirmwireLen;//	 目标固件长度

}UpdateConfig ;

 




typedef struct _UPDATA_HEADER
{
	char IMEI[15];	/* 终端地址 */
	u8 curVer;     /* 当前版本 */
	u8 reqVer;		/* 请求版本 */
}UPDATA_HEADER;

 

/*平台回复终端请求下载升级文件的请求*/
typedef struct _SERVER_INFOACK 
{
	uint16 OnePackageSize;//每包字节数	
	uint16 TotalPackageCount;	//总包数

	u8     ReqVersion; //请求的版本
	
}SERVER_INFOACK_S;	


/* 终端请求下载升级文件第N包 */
typedef struct _SERVER_INFO
{
	uint16 sequence;	//请求数据包的序列号
}SERVER_INFO_T;	  


/* 平台回复终端请求下载升级文件第N包的请求，并发送下载包 */
typedef struct _SERVER_DATA
{
	uint16 pack_id;		//数据包编号
	uint8 data[500];	//每包字节数
	uint16 crc;
}SERVER_DATA_S;

 
 

 
u16 crc16h(char *ptr, uint32 len);  

 
extern void StartUpdate(u8 updateVersion,const char * imei, const  char * update_server_ip,const   char * update_server_port);
 
#endif
